<?php

namespace App\Traits;

use Illuminate\Support\Facades\Storage;

trait ImagePath
{
    protected $defaultTemplate = 'small';

    protected $options = [
        'template' => 'small',
    ];

    /**
     * 设置缓存配置
     *
     * @param array $options
     * @return $this
     */
    public function options($options = [])
    {
        $this->options = array_merge($this->options, $options);
        return $this;
    }

    /**
     * 批量替换
     *
     * @param array $images
     * @return array
     */
    public static function setImagesPath($images = [])
    {
        if ($images == null) {
            return null;
        }
        if (!$images) {
            return [];
        }
        foreach ($images as &$image) {
            $image = self::setPath($image);
        }
        return $images;
    }

    /**
     * 根据存盘路径返回缓存路径
     *
     * @param $path
     * @return null|string|string[]
     */
    public static function setPath($path)
    {
        if ($path === null || is_array($path)) {
            return null;
        } elseif ((is_string($path) && url()->isValidUrl($path)) || strpos($path, 'data:image') === 0) {
            $src = $path;
        } else {
            $src = Storage::disk('admin')->url($path);
        }
        return $src;
    }

    public function urlPathToCache($url, $template = null)
    {
        $template = $template ?? $this->defaultTemplate;
        return preg_replace('/(.*)(\/storage\/)(.*)/', '${1}/' . config('imagecache.route') . '/' . $template . '/${3}', $url);
    }

    /**
     * 缩小图片
     *
     * @param $imagePath
     * @param int $xx  |最大长度
     * @param int $yy   |最大宽度
     * @return bool
     */
    public function cutImage($imagePath, $xx = 1000, $yy = 500)
    {
        //获取图片信息
        list($imgw, $imgh, $imgt) = getimagesize($imagePath);
        //判断是否缩放
        if ($imgw <= $xx && $imgh <= $yy) {
            return false;
        }
        //计算缩小的比例，高不能超过$xx,宽不能超过$yyy

        $percent = ($yy / $imgh) > ($xx / $imgw) ? ($xx / $imgw) : ($yy / $imgh); //以最长边作为缩放参考

        if ($percent < 1) {
            //计算缩略图的新尺寸
            $new_width  = floor($imgw * $percent);
            $new_height = floor($imgh * $percent);
        } else {
            //如果原图尺寸小于 150x150 直接输出原图尺寸
            $new_width  = $imgw;
            $new_height = $imgh;
        }
        $thumb = imagecreatetruecolor($new_width, $new_height);

        //读取图片
        switch ($imgt) {
            //判断格式，图像类型，但缩略图输出的都是jpg..参考下文
            case 1:
                $orgimg = imagecreatefromgif($imagePath);
                break;
            case 2:
                $orgimg = imagecreatefromjpeg($imagePath);
                break;
            case 3:
                $orgimg = imagecreatefrompng($imagePath);
                break;
        }
        //imagecopyresampled(缩略图片资源, 源图片资源, dx, dy, sx,sy, 新图像宽度, 新图像高度, 源图像宽度, 源图像高度);
        imagecopyresampled($thumb, $orgimg, 0, 0, 0, 0, $new_width, $new_height, $imgw, $imgh); //缩放核心函数

        imagejpeg($thumb, $imagePath, 90); //输出图像
        //销毁资源
        imagedestroy($thumb);
        imagedestroy($orgimg);
    }
}